﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmResumenDeVentasPorMes.xaml
    /// </summary>
    public partial class FrmEstadoDeUnPedidoEnProduccion : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtConsultaTmp;//FJRF - Usamos este DataTable para hacer consultas generales temporales
        DataTable DtConsultaPrincipal;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;//FJRF - Usamos este DataTable para imprimir
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto

        string StrCodigoPrimerColorReferencia;

        String StrNumeroPedido;//FJRF - Numero del pedido

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        #endregion

        public FrmEstadoDeUnPedidoEnProduccion()
        {
            InitializeComponent();
        }

        #region FJRF - OBJETOS DEL FORMULARIO
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            string strTituloVentana = "ESTADO DE UN PEDIDO EN PRODUCCIÓN" + " - Usuario:" + MDOgeneral.usuario + " - [FrmEstadoDeUnPedidoEnProduccion]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            TxtPedido.Style = null;//FJRF - Le quitamos el estilo para que no pase el foco
            TxtPedido.Focus();//FJRF - Ponemos el foco en pedidos
        }
        private void TxtPedido_TextChanged(object sender, TextChangedEventArgs e)
        {
            DtgEstadoDeUnPedidoEnProduccion.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtConsulta = null;//FJRF - Limpiamos la consulta
            DtgEstadoDeUnPedidoEnProduccion.Items.Clear();//FJRF - Quitamos los datos del grid

            DtgEstadoDeUnPedidoEnProduccionDetalle.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtConsultaTmp = null;//FJRF - Limpiamos la consulta
            DtgEstadoDeUnPedidoEnProduccionDetalle.Items.Clear();//FJRF - Quitamos los datos del grid

            PttV_LimpiarTotales();

            if (TxtPedido.Text.Length >= 3)//FJRF - Si lo digitado es mayor o igual a tres caracteres hacemos lo siguiente
            {
                LblCodigoCliente.Content = TxtPedido.Text.ToUpper().Substring(0, 3);//FJRF - Extraemos y visualizamos solo los tres primeros caracteres poniendolos en mayusculas y esto equivale al codigo del cliente
                LblNombreCliente.Content = MdoGeneral.StrRetornarUnSoloCampo("NOMCLI_CLI", "NOMBRECLIENTE", "MAECLIP", "CODCLI_CLI = '" + LblCodigoCliente.Content + "' ");//FJRF - Buscamos el nombre del cliente con el codigo extraido

                StrNumeroPedido = TxtPedido.Text.ToUpper().Replace(LblCodigoCliente.Content.ToString(),"");//FJRF - Extraemos solo el numero del pedido quitando el codigo del cliente

                StrConsulta = "SELECT CODCLI_EPC, NROPED_EPC, FECPED_EPC, FECENT_EPC, ESTPED_EPC, OBSPED_EPC, PEDORI_EPC, SUBCLI_EPC, NOMCLI_CLI, DESPED_EPC ";//FJRF - Seleccionamos los campos con los que trabajaremos
                StrConsulta = StrConsulta + "FROM ENCPPCP, MAECLIP ";//FJRF - las tablas de los campos
                StrConsulta = StrConsulta + "WHERE SUBCLI_EPC = CODCLI_CLI ";//FJRF - Establecemos la relacion
                StrConsulta = StrConsulta + "AND CODCLI_EPC = '" + LblCodigoCliente.Content + "' ";//FJRF - Buscamos cuando el cliente sea el siguiente
                StrConsulta = StrConsulta + "AND NROPED_EPC = '" + StrNumeroPedido + "' ";//FJRF - Buscamos cuando el numero del pedido sea el siguiente

                try
                {
                    if (String.IsNullOrEmpty(StrNumeroPedido) == false)//FJRF - Si el numero de pedido tiene datos hacemos lo siguiente
                    {
                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos
                        if (DtConsulta.Rows.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                        {
                            LblCodigoSubCliente.Content = DtConsulta.Rows[0]["SUBCLI_EPC"].ToString();//FJRF - Traemos los datos consultados
                            LblNombreSubCliente.Content = DtConsulta.Rows[0]["NOMCLI_CLI"].ToString();//FJRF - Traemos los datos consultados
                            DtpFechaPedido.SelectedDate = DateTime.Parse(DtConsulta.Rows[0]["FECPED_EPC"].ToString());//FJRF - Traemos los datos consultados
                            DtpFechaPedidoEntrega.SelectedDate = DateTime.Parse(DtConsulta.Rows[0]["FECENT_EPC"].ToString());//FJRF - Traemos los datos consultados
                            LblOriginal.Content = DtConsulta.Rows[0]["PEDORI_EPC"].ToString();//FJRF - Traemos los datos consultados
                        }
                        else//FJRF - Si la consulta no tiene datos hacemos lo siguiente
                        {
                            PttV_LimpiarEncabezado();//FJRF - Limpiamos los datos 
                        }
                    }
                    else//FJRF - Si el pedido no tiene datos hacemos lo siguiente
                    {
                        PttV_LimpiarEncabezado();//FJRF - Limpiamos los datos 
                    }
                }
                catch (Exception ex)//FJRF - Si se presente un error hacemos lo siguiente
                {
                    PttV_LimpiarEncabezado();//FJRF - Limpiamos los datos 
                }
            }
            else//FJRF - Si no tiene tres o mas caracteres hacemos lo siguiente
            {
                LblCodigoCliente.Content = "";//FJRF - Eliminamos el codigo
                LblNombreCliente.Content = "";//FJRF - Eliminamos el nombre
            }
        }
        protected void PttV_LimpiarEncabezado()
        {
            LblCodigoSubCliente.Content = "";//FJRF - Limpiamos el dato
            LblNombreSubCliente.Content = "";//FJRF - Limpiamos el dato
            DtpFechaPedido.SelectedDate = null;//FJRF - Limpiamos el dato
            DtpFechaPedidoEntrega.SelectedDate = null;//FJRF - Limpiamos el dato
            LblOriginal.Content = "";//FJRF - Limpiamos el dato
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PttV_Imprimir();//FJRF - Imprimimos los datos
        }
        private void TxtPedido_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                if (TxtPedido.Text.Length > 3)//FJRF - Si ya se han digitado mas de tres caracteres hacemos lo siguiente
                {
                    PubV_Procesar();//FJRF - Buscamos la informacion
                }
            }
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PubV_Procesar();//FJRF - Buscamos la informacion
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        private void DtgEstadoDeUnPedidoEnProduccion_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDO" || strNombreColumna == "ENTREGADO" || strNombreColumna == "PROGRAMADO" || strNombreColumna == "CORTADO" || strNombreColumna == "PREPARADO" || strNombreColumna == "GUARNECIDO" || strNombreColumna == "MONTAJE")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgEstadoDeUnPedidoEnProduccion_KeyUp(object sender, KeyEventArgs e)
        {
            if (DtgEstadoDeUnPedidoEnProduccion.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = DtgEstadoDeUnPedidoEnProduccion.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;


                PttV_ConsultarDatosPedido(LblCodigoCliente.Content.ToString(), StrNumeroPedido, StrCodigoReferencia, StrColorReferencia);//FJRF - Buscamos el detalle del pedido
            }
        }
        private void DtgEstadoDeUnPedidoEnProduccion_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (DtgEstadoDeUnPedidoEnProduccion.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = DtgEstadoDeUnPedidoEnProduccion.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;

                PttV_ConsultarDatosPedido(LblCodigoCliente.Content.ToString(), StrNumeroPedido, StrCodigoReferencia, StrColorReferencia);//FJRF - Buscamos el detalle del pedido
            }
        }
        private void DtgEstadoDeUnPedidoEnProduccionDetalle_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANORD" || strNombreColumna == "CANPRG" || strNombreColumna == "CANCOR" || strNombreColumna == "CANPRP" || strNombreColumna == "CANGUA" || strNombreColumna == "CANMON" || strNombreColumna == "CANDES")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }

        protected void PttV_ConsultarDatosPedido(String StrCliente, String StrNumeroPedidoSeleccionado, String StrCodigoReferenciaSeleccionada, String StrColorSeleccionado)
        {
            StrConsulta = "SELECT NROORD_EOP AS ORDEN, FECORD_EOP AS FECHA, ";//FJRF - Traemos los campos que no tienen procesos
            StrConsulta = StrConsulta + "SUM(CANORD_DOP) AS CANORD, ";//FJRF - Buscamos la cantidad ordenada
            StrConsulta = StrConsulta + "SUM(CANPRG_DOP) AS CANPRG, ";//FJRF - Buscamos la cantidad programada
            StrConsulta = StrConsulta + "SUM(CANCOR_DOP) AS CANCOR, ";//FJRF - Buscamos la cantidad cortada
            StrConsulta = StrConsulta + "SUM(CANPRP_DOP) AS CANPRP, ";//FJRF - Buscamos la cantidad preparado
            StrConsulta = StrConsulta + "SUM(CANGUA_DOP) CANGUA, ";//FJRF - Buscamos la cantidad guarnecida
            StrConsulta = StrConsulta + "SUM(CANMON_DOP) CANMON, ";//FJRF - Buscamos la cantidad montaje
            StrConsulta = StrConsulta + "SUM(CANDES_DOP) CANDES ";//FJRF - Buscamos la cantidad despachado
            StrConsulta = StrConsulta + "FROM ENCORDP, DETORDP ";//FJRF - las tablas que traen los datos
            StrConsulta = StrConsulta + "WHERE CODCLI_EOP = '" + StrCliente + "' ";//FJRF - la condicion 1
            StrConsulta = StrConsulta + "AND NROPED_EOP = '" + StrNumeroPedidoSeleccionado + "' ";//FJRF - la condicion 2 
            StrConsulta = StrConsulta + "AND CODREF_DOP = '" + StrCodigoReferenciaSeleccionada + "' ";//FJRF - la condicion 3 
            StrConsulta = StrConsulta + "AND CODCOL_DOP = '" + StrColorSeleccionado + "' ";//FJRF - la condicion 4
            StrConsulta = StrConsulta + "AND NROORD_DOP = NROORD_EOP ";//FJRF - asociamos las tablas
            StrConsulta = StrConsulta + "GROUP BY NROORD_EOP, FECORD_EOP ";//FJRF - agrupamos los datos
            StrConsulta = StrConsulta + "ORDER BY NROORD_EOP";//FJRF - ordenamos

            DtConsultaTmp = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos
            DtgEstadoDeUnPedidoEnProduccionDetalle.ItemsSource = DtConsultaTmp.DefaultView;
        }
        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES PROPIAS DEL FORMULARIO
        public void PubV_Procesar()
        {
            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos el cursor en forma de espera

            EjecutarSp_SP_ESTPEDPRD(LblCodigoCliente.Content.ToString(), StrNumeroPedido);//FJRF - Buscamos los datos

            StrConsulta = "SELECT CODREF_TMP AS CODREF, NOMREF_TMP AS REFERENCIA, CODCOL_TMP AS CODCOL, NOMCOL_TMP AS COLOR, CANPED_TMP AS PEDIDO, CANENT_TMP AS ENTREGADO, CANPRG_TMP AS PROGRAMADO, CANCOR_TMP AS CORTADO, CANPRP_TMP AS PREPARADO, CANGUA_TMP AS GUARNECIDO, CANMON_TMP AS MONTAJE ";//FJRF - Los campos de la consulta
            StrConsulta = StrConsulta + "FROM TMPESTPEDPRD ";//FJRF - La tabla a consultar
            StrConsulta = StrConsulta + "ORDER BY NOMREF_TMP, NOMCOL_TMP ";//FJRF - La tabla a consultar

            DtConsultaPrincipal = MdoGeneral.consulta(StrConsulta);//FJRF - Consultamos la tabla en la base de datos de bogota

            DtgEstadoDeUnPedidoEnProduccion.ItemsSource = DtConsultaPrincipal.DefaultView;//FJRF - Mostramos los datos

            #region FJRF - Sumamos totales
            if (DtConsultaPrincipal.Rows.Count > 0)
            {
                Double DblPedido = 0, DblEntregado = 0, DblProgramado = 0, DblCortado = 0, DblPreparado = 0, DblGuarnecido = 0, DblMontaje = 0;
                for (int IntFilaActual = 0; IntFilaActual < DtConsultaPrincipal.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    DblPedido = DblPedido + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["PEDIDO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    DblEntregado = DblEntregado + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["ENTREGADO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                    DblProgramado = DblProgramado + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["PROGRAMADO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    DblCortado = DblCortado + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["CORTADO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    DblPreparado = DblPreparado + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["PREPARADO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    DblGuarnecido = DblGuarnecido + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["GUARNECIDO"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    DblMontaje = DblMontaje + Double.Parse(DtConsultaPrincipal.Rows[IntFilaActual]["MONTAJE"].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                }
                LblTotalPedido.Content = DblPedido;//FJRF - Asiganamos los totales
                LblTotalEntregado.Content = DblEntregado;//FJRF - Asiganamos los totales

                LblTotalProgramado.Content = DblProgramado;//FJRF - Asiganamos los totales
                LblTotalCortado.Content = DblCortado;//FJRF - Asiganamos los totales
                LblTotalPreparado.Content = DblPreparado;//FJRF - Asiganamos los totales
                LblTotalGuarnecido.Content = DblGuarnecido;//FJRF - Asiganamos los totales
                LblTotalMontaje.Content = DblMontaje;//FJRF - Asiganamos los totales
            }
            else
            {
                PttV_LimpiarTotales();
            }
            #endregion

            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el foco de forma normal
        }
        protected void PttV_LimpiarTotales()
        {
            LblTotalPedido.Content = "0000";//FJRF - Limpiamos los datos
            LblTotalEntregado.Content = "0000";//FJRF - Limpiamos los datos

            LblTotalProgramado.Content = "0000";//FJRF - Limpiamos los datos
            LblTotalCortado.Content = "0000";//FJRF - Limpiamos los datos
            LblTotalPreparado.Content = "0000";//FJRF - Limpiamos los datos
            LblTotalGuarnecido.Content = "0000";//FJRF - Limpiamos los datos
            LblTotalMontaje.Content = "0000";//FJRF - Limpiamos los datos
        }
        private void EjecutarSp_SP_ESTPEDPRD(String Str_CodigoCliente, String Str_NumeroPedido)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_ESTPEDPRD";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;//FJRF - Nos conectamos de forma normal

                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_codcli", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_CodigoCliente;
                MDOgeneral.spComando.Parameters.Add("pnu_nroped", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = Str_NumeroPedido;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                StrCaptionBox = "PROCESO CANCELADO";//FJRF - Titulo del mensaje
                StrMensajeBox = ex.Message.ToString();//FJRF - Mensaje a enviar

                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }
        protected void PttV_Imprimir()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptEstadoDeUnPedidoEnProduccion.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir
                    if (DtConsultaPrincipal == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = DtConsultaPrincipal.Copy();//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                    DsImprimir = new DataSet("dsEstadoDeUnPedidoEnProduccion");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrNumeroDePedido", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrCodigoCliente", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrNombreCliente", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrCodigoSubCliente", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrNombreSubCliente", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("DttFechaPedido", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("DttFechaPedidoEntrega", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrOriginal", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores
            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = txtTituloFormulario.Text.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrNumeroDePedido"] = StrNumeroPedido;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrCodigoCliente"] = LblCodigoCliente.Content.ToString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrNombreCliente"] = LblNombreCliente.Content.ToString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrCodigoSubCliente"] = LblCodigoSubCliente.Content.ToString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrNombreSubCliente"] = LblNombreSubCliente.Content.ToString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["DttFechaPedido"] = DtpFechaPedido.SelectedDate;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["DttFechaPedidoEntrega"] = DtpFechaPedidoEntrega.SelectedDate;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrOriginal"] = LblOriginal.Content.ToString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {
                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        private void DtgEstadoDeUnPedidoEnProduccionDetalle_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (DtgEstadoDeUnPedidoEnProduccionDetalle.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = DtgEstadoDeUnPedidoEnProduccionDetalle.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrOrden = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada

                FRMconsordens _co = new FRMconsordens();
                _co.texOrd.Text = StrOrden;
                _co.texPed.Text = "0";
                _co.texRef.Text = "";
                _co.comCli.SelectedIndex = -1;
                _co.comCol.SelectedIndex = -1;
                _co.comSub.SelectedItem = -1;
                _co.datePicker1.SelectedDate = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString());
                _co.filtraOrd();
                _co.ShowDialog();
            }
        }

        #endregion

        private void imgFoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //Para llamar el PDF de la ficha tecnica de la referencia
            if (File.Exists(MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF"))
            {
                //MessageBox.Show("Si existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Hand, MessageBoxResult.OK);
                String fileName = MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF";
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                process.StartInfo.FileName = fileName;
                process.Start();
            }
            else
            {
                MessageBox.Show("No existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
            }
        }
    }
}

